home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / modex100.zip / UTILS.ASM < prev    next >
Assembly Source File  |  1993-05-07  |  7KB  |  347 lines

  1. ;UTILS.ASM  - Utilities for QuickBasic
  2.  
  3.     PAGE    255, 132
  4.  
  5.     .MODEL Medium
  6.     .286
  7.  
  8.     ; ==== MACROS ====
  9.  
  10.     ; Macro to OUT a 16 bit value to an I/O port
  11.  
  12. OUT_16 MACRO Register, Value
  13.     IFDIFI <Register>, <DX>            ; If DX not setup
  14.         MOV        DX, Register        ; then Select Register
  15.     ENDIF
  16.     IFDIFI <Value>, <AX>            ; If AX not setup 
  17.         MOV        AX, Value            ; then Get Data Value
  18.     ENDIF
  19.         OUT        DX, AX                ; Set I/O Register(s)
  20. ENDM
  21.  
  22.     ; Macro to OUT a 8 bit value to an I/O Port
  23.  
  24. OUT_8 MACRO Register, Value
  25.     IFDIFI <Register>, <DX>            ; If DX not setup
  26.         MOV        DX, Register        ; then Select Register
  27.     ENDIF
  28.     IFDIFI <Value>, <AL>            ; If AL not Setup
  29.         MOV        AL, Value            ; then Get Data Value
  30.     ENDIF
  31.         OUT        DX, AL                ; Set I/O Register
  32. ENDM
  33.  
  34.     ; macros to PUSH and POP multiple registers
  35.  
  36. PUSHx MACRO R1, R2, R3, R4, R5, R6, R7, R8
  37.     IFNB <R1>
  38.         PUSH    R1                ; Save R1
  39.         PUSHx    R2, R3, R4, R5, R6, R7, R8
  40.     ENDIF
  41. ENDM
  42.  
  43. POPx MACRO R1, R2, R3, R4, R5, R6, R7, R8
  44.     IFNB <R1>
  45.         POP        R1                ; Restore R1
  46.         POPx    R2, R3, R4, R5, R6, R7, R8
  47.     ENDIF
  48. ENDM
  49.  
  50.     ; Macro to Clear a Register to 0
  51.  
  52. CLR MACRO Register
  53.     XOR        Register, Register        ; Set Register = 0
  54. ENDM
  55.  
  56.     ; Macros to Decrement Counter & Jump on Condition
  57.  
  58. LOOPx MACRO Register, Destination
  59.     DEC        Register                ; Counter--
  60.     JNZ        Destination                ; Jump if not 0
  61. ENDM
  62.  
  63. LOOPjz MACRO Register, Destination
  64.     DEC        Register                ; Counter--
  65.     JZ        Destination                ; Jump if 0
  66. ENDM
  67.  
  68.  
  69.     ; ==== General Constants ====
  70.  
  71.     False    EQU    0
  72.     True    EQU    -1
  73.     nil        EQU 0
  74.  
  75.     b        EQU    BYTE PTR
  76.     w        EQU    WORD PTR
  77.     d        EQU    DWORD PTR
  78.     o        EQU    OFFSET
  79.     f        EQU FAR PTR
  80.     s        EQU    SHORT
  81.     ?x4        EQU <?,?,?,?>
  82.     ?x3        EQU <?,?,?>
  83.  
  84.  
  85. IFDEF FARSTRINGS
  86.  
  87.     EXTRN    stringaddress:far
  88.     EXTRN    stringlength:far
  89.  
  90. ENDIF
  91.  
  92.  
  93.     .Data
  94.  
  95.     EVEN
  96.  
  97. RND_Seed    DW    7397, 29447, 802
  98. RND_Mult    DW    179, 183, 182
  99. RND_ModV    DW    32771, 32779, 32783
  100.  
  101. CR_LF        DB    13, 10            ; the CRLF data
  102.  
  103.     .Code
  104.  
  105.  
  106. ;DOS_PRINT  (Text$) - Print Text Directly to DOS console w/ CR/LF
  107.  
  108.  
  109.     PUBLIC    DOS_PRINT
  110.  
  111. DP_Stack    STRUC
  112.                 DW    ?x4    ; DI, SI, DS, BP
  113.                 DD    ?    ; Caller
  114.     DP_Text        DW    ?    ; Address of Text$ Descriptor
  115. DP_Stack    ENDS
  116.  
  117.  
  118. DOS_PRINT     PROC     FAR
  119.  
  120.     PUSHx    BP, DS, SI, DI        ; Preserve Important Registers
  121.     MOV        BP, SP                ; Set up Stack Frame
  122.  
  123.     MOV     SI, [BP].DP_Text        ; Get Addr of Text$ descriptor
  124.  
  125. IFDEF FARSTRINGS
  126.     PUSH    SI                    ; Push Addr of BC7 Decriptor Ptr
  127.     CALL    stringaddress        ; Get Address + Len of string!!!
  128.                                 ; DX:AX = Addr  CX = Len
  129.     MOV        DS, DX                ; DS = DX = Segment of string
  130.     MOV        DX, AX                ; DX = AX = Offset of String
  131. ELSE
  132.     MOV     CX, [SI]             ; put its length into CX
  133.     MOV     DX, [SI+02]          ; now DS:DX points to the String
  134. ENDIF
  135.  
  136.     JCXZ    @No_Print            ; Don't Print if empty
  137.  
  138.     MOV        BX, 1                ; 1= DOS Handle for Display
  139.     MOV        AH, 40h                ; Write Text Function
  140.     INT        21h                    ; Call DOS to do it
  141.  
  142. @No_Print:
  143.     MOV        AX, SEG DGROUP        ; Restore DGroup
  144.     MOV        DS, AX
  145.  
  146.     MOV        DX, o CR_LF            ; Get Addr of CR/LF pair
  147.     MOV        CX, 2                ; 2 Characters to Write        
  148.     MOV        BX, 1                ; 1= DOS Handle for Display
  149.  
  150.     MOV        AH, 40h                ; Write Text Function
  151.     INT        21h                    ; Call DOS to do it
  152.  
  153.     CLD                            ; Reset Direction Flag        
  154.     POPx    DI, SI, DS, BP        ; Restore Saved Registers
  155.     RET        2                    ; Exit & Clean Up Stack
  156.  
  157. DOS_PRINT     ENDP
  158.  
  159.  
  160. ;DOS_PRINTS (Text$) - Print Text Directly to DOS console
  161.  
  162.     PUBLIC    DOS_PRINTS
  163.  
  164. DOS_PRINTS     PROC     FAR
  165.  
  166.     PUSHx    BP, DS, SI, DI        ; Preserve Important Registers
  167.     MOV        BP, SP                ; Set up Stack Frame
  168.  
  169.     MOV     SI, [BP].DP_Text    ; Get Addr of Text$ descriptor
  170.  
  171. IFDEF FARSTRINGS
  172.     PUSH    SI                    ; Push Addr of BC7 Decriptor Ptr
  173.     CALL    stringaddress        ; Get Address + Len of string!!!
  174.                                 ; DX:AX = Addr  CX = Len
  175.     MOV        DS, DX                ; DS = DX = Segment of string
  176.     MOV        DX, AX                ; DX = AX = Offset of String
  177. ELSE
  178.     MOV     CX, [SI]             ; put its length into CX
  179.     MOV     DX, [SI+02]          ; now DS:DX points to the String
  180. ENDIF
  181.  
  182.     JCXZ    @DPS_Exit            ; Don't Print if empty
  183.  
  184.     MOV        BX, 1                ; 1= DOS Handle for Display
  185.     MOV        AH, 40h                ; Write Text Function
  186.     INT        21h                    ; Call DOS to do it
  187.  
  188. @DPS_Exit:
  189.     CLD                            ; Reset Direction Flag        
  190.     POPx    DI, SI, DS, BP        ; Restore Saved Registers
  191.     RET        2                    ; Exit & Clean Up Stack
  192.  
  193. DOS_PRINTS     ENDP
  194.  
  195.  
  196. ;======================
  197. ;SET_VIDEO_MODE (Mode%) 
  198. ;======================
  199. ;
  200. ;Sets the Video Mode through the BIOS
  201. ;
  202.  
  203.     PUBLIC    SET_VIDEO_MODE
  204.  
  205. SVM_Stack    STRUC
  206.                 DW    ?x4    ; DI, SI, DS, BP
  207.                 DD    ?    ; Caller
  208.     SVM_Mode    DB    ?,? ; Desired Video Mode
  209. SVM_Stack    ENDS
  210.  
  211.  
  212. SET_VIDEO_MODE    PROC    FAR
  213.  
  214.     PUSHx    BP, DS, SI, DI        ; Preserve Important Registers
  215.     MOV        BP, SP                ; Set up Stack Frame
  216.  
  217.     CLR        AH                    ; Function 0
  218.     MOV        AL, [BP].SVM_Mode    ; Get Mode #
  219.  
  220.     INT        10H                    ; Change Video Modes
  221.  
  222. @SVM_Exit:
  223.     POPx    DI, SI, DS, BP        ; Restore Saved Registers
  224.     RET        2                    ; Exit & Clean Up Stack
  225.  
  226. SET_VIDEO_MODE    ENDP
  227.  
  228.  
  229. ;==============
  230. ;SCAN_KEYBOARD%
  231. ;==============
  232. ;
  233. ;Function to scan keyboard for a pressed key
  234. ;
  235.  
  236.     PUBLIC    SCAN_KEYBOARD
  237.  
  238. SCAN_KEYBOARD    PROC    FAR
  239.  
  240.     PUSHx    BP, DS, SI, DI        ; Preserve Important Registers
  241.  
  242.     MOV        AH, 01H                ; Function #1
  243.     INT        16H                    ; Call Keyboard Driver
  244.     JZ        @SK_NO_KEY            ; Exit if Zero flag set
  245.  
  246.     MOV        AH,    00H                ; Remove Key from Buffer
  247.     INT        16H                    ; Get Keycode in AX
  248.  
  249.     OR        AL, AL                ; Low Byte Set (Ascii?)
  250.     JZ        @SK_Exit            ; if not, it's a F-Key
  251.  
  252.     CLR        AH                    ; Clear ScanCode if Ascii
  253.     JMP        s @SK_Exit            ; Return Key in AX
  254.  
  255. @SK_NO_KEY:
  256.     CLR        AX                    ; Return Nil (no Keypress)
  257.  
  258. @SK_Exit:
  259.     CLD                            ; Reset Direction Flag        
  260.     POPx    DI, SI, DS, BP        ; Restore Saved Registers
  261.     RET                            ; Exit & Clean Up Stack
  262.  
  263. SCAN_KEYBOARD    ENDP
  264.  
  265.  
  266. ;====================
  267. ;RANDOM_INT (MaxInt%)
  268. ;====================
  269.  
  270.  
  271.     PUBLIC    RANDOM_INT
  272.  
  273. RI_Stack    STRUC
  274.                 DW    ?    ; BP
  275.                 DD    ?    ; Caller
  276.     RI_MaxVal    DW    ?    ; Maximum Value to Return + 1
  277. RI_Stack    ENDS
  278.  
  279.  
  280. RANDOM_INT    PROC    FAR
  281.  
  282.     PUSH    BP                    ; Preserve Important Registers
  283.     MOV        BP, SP                ; Set up Stack Frame
  284.  
  285.        CLR        BX                    ; BX is the data index
  286.     CLR        CX                      ; CX is the accumulator
  287.  
  288. REPT 3
  289.       MOV        AX, RND_Seed[BX]    ; load the initial seed
  290.     MUL        RND_Mult[BX]        ; multiply it
  291.     DIV        RND_ModV[BX]        ; and obtain the Mod value
  292.     MOV        RND_Seed[BX], DX    ; save that for the next time
  293.  
  294.     ADD        CX, DX                ; add it into the accumulator
  295.     INC        BX
  296.     INC        BX                  ; point to the next set of values
  297. ENDM
  298.  
  299.     MOV        AX, CX                ; AX = Random #
  300.     CLR        DX                    ; DX = 0
  301.     DIV        [BP].RI_MaxVal        ; DX = DX:AX / MAxVal Remainder
  302.  
  303.     MOV        AX, DX
  304.  
  305.     POP        BP                    ; Restore BP
  306.     RET        2                    ; back to BASIC with AX holding the result
  307.  
  308. RANDOM_INT    ENDP
  309.  
  310.  
  311. ;===========
  312. ;INIT_RANDOM
  313. ;===========
  314.  
  315.     PUBLIC    INIT_RANDOM
  316.  
  317. INIT_RANDOM    PROC    FAR
  318.  
  319.     CLR        AX                    ; Segment = 0000
  320.     MOV        ES, AX
  321.     MOV        AX, ES:[046Ch]      ; Get Timer Lo Word
  322.  
  323.     XOR        RND_Seed, AX        ; Scramble 1st Seed
  324.  
  325.     RET                            ; Exit & Clean Up Stack
  326.  
  327. INIT_RANDOM    ENDP
  328.  
  329. ;===========
  330. ;TIMER_COUNT
  331. ;===========
  332.  
  333.     PUBLIC  TIMER_COUNT
  334.  
  335. TIMER_COUNT      PROC    FAR
  336.  
  337.     CLR        AX                    ; Segment = 0000
  338.     MOV        ES, AX
  339.     MOV        AX, ES:[046Ch]      ; Get Timer Lo Word
  340.     MOV        DX, ES:[046Eh]        ; Get Timer Hi Word
  341.     RET                            ; Exit & Clean Up Stack
  342.  
  343. TIMER_COUNT      ENDP
  344.  
  345.  
  346.     END
  347.